/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wasolicitudesfiec.xsl.pdf;

import web.util.Constantes;
import entidad.ayudantias.TipoAyudantia.TipoAyudantiaEnum;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.faces.context.ExternalContext;
import javax.servlet.http.HttpServletRequest;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.apache.batik.transcoder.Transcoder;
import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.fop.svg.PDFTranscoder;
import wasolicitudesfiec.logicacontrol.*;
import web.util.HtmlEntities;

/**
 *
 * @author kabad
 */
public class Transformador {

    private String xml;
    private String svg;

    public Transformador() {
    }
    //este metodo toma el xsl plantilla y crea un objeto transformer
    //con el objeto transformer creo el svg, con el archivo xml de datos

    public String doIt(String idModelo, String xmlDatos, String nombreInstancia, ExternalContext externalContext, TipoAyudantiaEnum tipoayudantia) throws TransformerConfigurationException, IOException, TransformerException, TranscoderException, Exception {
        TransformerFactory tFactory = TransformerFactory.newInstance();
        javax.xml.transform.Transformer transformer;
        String pathPlantillaXsl = "";
        String pathArchivo = "";
        String pathCarpeta = "";
        HtmlEntities htmlEntities = new HtmlEntities();
        String path = "";
        HttpServletRequest servletRequest = (HttpServletRequest) externalContext.getRequest();
        String pathRaiz = (String) servletRequest.getAttribute("path");
        String pathPlantilla = pathRaiz + "/" + "Plantillas";

        try {
            if (idModelo.equals(Constantes.Modelo.modelo_SolicitarSerAyudante)) {
                if (tipoayudantia.equals(TipoAyudantiaEnum.ACADEMICA)) {
                    pathPlantillaXsl = pathPlantilla + "/Formulario_Ayudantia_Academica.xsl";
                } else {
                    pathPlantillaXsl = pathPlantilla + "/Formulario_Ayudantia_Varias.xsl";
                }
                pathCarpeta = pathRaiz + "/" + "Archivos" + "/" + "Solicitar Ser Ayudante" + "/" + nombreInstancia;
                path = "/" + "Archivos" + "/" + "Solicitar Ser Ayudante" + "/" + nombreInstancia;
            }
            if (idModelo.equals(Constantes.Modelo.modelo_SolicitarCambioCarrera)) {
                pathPlantillaXsl = pathPlantilla + "/Informe_Cambio_Carrera.xsl";
                pathCarpeta = pathRaiz + "/" + "Archivos" + "/" + "Solicitar Cambio" + "/" + nombreInstancia;
                path = "/" + "Archivos" + "/" + "Solicitar Cambio" + "/" + nombreInstancia;
            }
            if (idModelo.equals(Constantes.Modelo.modelo_SolicitarConvalidacionMateria)) {
                pathPlantillaXsl = pathPlantilla + "/Informe_Convalidacion_Materia.xsl";
                pathCarpeta = pathRaiz + "/" + "Archivos" + "/" + "Solicitar Convalidacion" + "/" + nombreInstancia;
                path = "/" + "Archivos" + "/" + "Solicitar Convalidacion" + "/" + nombreInstancia;
            }
            File carpeta = new File(pathCarpeta);
            carpeta.mkdirs();
            pathArchivo = pathCarpeta + "/" + nombreInstancia;
            path = path + "/" + nombreInstancia;
            //no generar el archivo si ya existe
            File f = new File(pathArchivo + ".pdf");
            if (!f.exists()) {
                //aplicamos los htmlentities, para poder trabajar con tildes, y caracteres especiales
                xml = htmlEntities.convertirISOSymbolEntities(xmlDatos);
                xml = htmlEntities.convertirISOCharacterEntities(xml);
                //            xml = htmlEntities.convertirOtherEntities(xmlDatos);
                transformer = tFactory.newTransformer(new StreamSource(pathPlantillaXsl));
                File file = new File("informe.xml");
                FileWriter fw = new FileWriter(file);
                fw.write(xml);
                fw.flush();
                fw.close();

                // 3.Usar el transformador para procesar el origen de datos XML
                // y obtener el resultado de la transformaciï¿½n
                transformer.transform(new StreamSource("informe.xml"), new StreamResult(new FileOutputStream(pathArchivo + ".svg")));
//	            transformer.transform(new StreamSource("C:\\Informe_Cambio_Carrera.xml"), new StreamResult(new FileOutputStream("C:\\Informe_Cambio_Carrera.svg")));

                //de svg a pdf
                File svgfile = new File(pathArchivo + ".svg");
                File pdffile = new File(pathArchivo + ".pdf");
                convertSVG2PDF(svgfile, pdffile);
                svgfile.delete();
            }
            return path + ".pdf";
        } catch (Exception ex) {
            ex.printStackTrace();
            throw ex;
        }

    }

    public void convertSVG2PDF(File svg, File pdf) throws IOException, TranscoderException {

        //Create transcoder
        Transcoder transcoder = new PDFTranscoder();
        //Transcoder transcoder = new org.apache.fop.render.ps.PSTranscoder();

        //Setup input
        InputStream in = new java.io.FileInputStream(svg);
        try {
            TranscoderInput input = new TranscoderInput(in);
            //Setup output
            OutputStream out = new java.io.FileOutputStream(pdf);
            out = new java.io.BufferedOutputStream(out);
            try {
                TranscoderOutput output = new TranscoderOutput(out);
                org.apache.batik.util.XMLResourceDescriptor.setXMLParserClassName("org.apache.xerces.parsers.SAXParser");

                //Do the transformation
                transcoder.transcode(input, output);
            } finally {
                out.close();
            }
        } finally {
            in.close();
        }
    }

    public String getXml() {
        return xml;
    }

    public void setXml(String xml) {
        this.xml = xml;
    }

    public String getSvg() {
        return svg;
    }

    public void setSvg(String svg) {
        this.svg = svg;
    }
}
